//www.RainbowFirm.com's Rainbow Software For Developing Variated Rainbow/Custom-Color Videos, Pictures, And Browsing
package rainbowPackage;

import java.awt.Dimension;

import javafx.application.Application;

//import android.graphics.Color;

import javafx.application.Platform;
import javafx.scene.*;
import javafx.scene.paint.Paint.*;
import javafx.scene.paint.Color.*;
import javafx.scene.Scene;
import javafx.stage.*;
import javafx.stage.Stage;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javafx.scene.input.MouseEvent;

import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.image.*;
//import javafx.scene.input.KeyEvent;

import javafx.fxml.FXMLLoader;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.scene.SnapshotParameters;

import java.awt.*;
import java.awt.image.*;
//import java.awt.event.ActionEvent;
import java.awt.Dimension;
import java.lang.Object;
import java.io.InputStream;
import java.io.File;
import javax.imageio.ImageIO;//Keep For .png Image Creation
import java.io.IOException;
import java.nio.ByteBuffer;

import javafx.scene.paint.Color;
import javafx.geometry.Rectangle2D;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyCodeCombination;
//import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.image.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.image.WritableImage.*;
//import javafx.scene.input.KeyEvent;
//import javafx.scene.layout.VBox;
import javafx.scene.text.*;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.scene.layout.*;
//import javafx.scene.shape.*;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
//import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

//import java.util.Timer;
//import java.util.TimerTask;
import java.lang.Object.*;
import org.apache.commons.io.*;
import java.io.PrintWriter;
import java.io.PrintStream;
import javax.swing.JFileChooser;
//import javafx.stage.DirectoryChooser;
//import javafx.stage.FileChooser;
import javafx.embed.swing.SwingFXUtils;
import javafx.embed.swing.SwingFXUtils.*;
//import org.openqa.selenium.By;
//import org.openqa.selenium.WebDriver;
//import org.openqa.selenium.firefox.FirefoxDriver;

//import com.sun.tools.javac.api.JavacTaskPool.Worker;

//import org.apache.commons.io.FileUtils;

//import org.openqa.selenium.OutputType;

//import org.openqa.selenium.TakesScreenshot;

import java.io.*;

import org.jcodec.api.SequenceEncoder;
import org.jcodec.api.SequenceEncoder.*;
import org.jcodec.api.awt.AWTSequenceEncoder;
import org.jcodec.common.Codec;
import org.jcodec.common.Format;
import org.jcodec.common.io.NIOUtils;
import org.jcodec.common.io.SeekableByteChannel;
import org.jcodec.common.model.Rational;
import org.jcodec.scale.AWTUtil;
import org.jcodec.api.*;
import java.nio.channels.*;
//import java.nio.channels.SeekableByteChannel;
import org.jcodec.*;//Keep For .mp4 Video Creation

//www.allaviacad.com Owns
//www.freeworldalliance.org Which Operates
//www.rainbowfirm.com Which Provides
//RainbowSoft For The Pixies To Use And Control In Their Local Area Under The Angels Of The
//www.orderofmagi.com Who Protect The
//rainbowPackage Where It All Is,
//main Starts Application
//RainbowMainBody Extends Application To Begin
//start Which Starts Threading
//Which Runs Setup
//Which Begins Engine To Deploy
//RainbodSoft2D Which Maintains Loop Of
//RainbowVideo.java Which Accesses
//RainbowColorCodeSchemes.java For Frames
//Which Uses RainbowSoftColorCodes.java Of
//RainbowSoftColorCode.java Codes Of
//VibrantColors.java Class To Configure Where Patterns Are Displayed Through Accessing
//RainbowPattern2D.java For Each Rainbow/Custom Pattern, Which Accesses
//RainbowSoftColor.java For Each Rainbow/Custom Color Determination, Which Uses
//ColorSlider.java For Variation Determination Between 2 Of Each Color Points And Can Use
//TranspaerencySlider.java As Well For Transparency Determination At The Same Time, And The
//ColorTooSimilar.java Class Is For Checking To See If 2 Colors Are To Similar For Another Color To Be Displayed Allowing Text To Be Seen Throughout
//RainbowFirm's
//Rainbow Hardware Developments That Make
//RainbowSoft's
//Proprietary Rainbow Software Which With Proper Computational Support And Expertise Makes
//Ideal Variated Rainbow/Custom Videos

/*public class RainbowMainBody {

	public RainbowMainBody() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}*/
public class RainbowMainBody extends Application 
{	
	/* RainbowMainBody.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
    {
        public void handle(MouseEvent event) 
        {
            System.exit(0);
        }
    });// */
	@Override
	public void start(Stage stage) throws IOException
	{
		Thread thread = new Thread();//(() -> {

		stage.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
		{
			public void handle(MouseEvent event) 
			{
				System.exit(0);
			}
		});

		try { Thread.sleep(400); }
		catch (InterruptedException exc) { throw new Error("Unexpected interruption", exc); }
		// Update text on FX Application Thread:
		/*stage.addEventHandler(KeyEvent.KEY_RELEASED, (KeyEvent event) -> {
	        if (KeyCode.ESCAPE == event.getCode()) {
	            stage.close();
	        }
	    });//*/
		/*stage.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
			public void handle(KeyEvent event) {
				if (changeHotkey) {
					if (addHotkey(event, changeHotkeyFunction)) {
						changeHotkey = false;
					}
				}
			}
		});//*/

		Platform.runLater(new Runnable() {
			public void run()
			{
				//@Override
				stage.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
				{
					@Override
					public void handle(MouseEvent event) 
					{
						System.exit(0);
					}
				});// */

				//try { onKeyPressed (KeyEvent); }
				//catch(IOException ie) { ie.printStackTrace(); }
				try { Setup(stage, thread ); }
				catch(IOException ie) { ie.printStackTrace(); }
			}
		});

		thread.setDaemon(true);
		thread.start();
	}

	static void Setup( Stage primaryStage, Thread primaryThread ) throws IOException
	{
		primaryStage.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
		{
			@Override
			public void handle(MouseEvent event) 
			{
				System.exit(0);
			}
		});

		primaryStage.setTitle("Sonnet");

		boolean primaryIsFullScreened = true;

		// This is how you know how much screen you can write to.
		Screen primaryScreen = Screen.getPrimary();
		Rectangle2D primaryBounds = primaryScreen.getVisualBounds();
		System.out.println(primaryBounds);

		//primaryStage.setX(0);
		//primaryStage.setY(0);
		KeyCombination fullScreenedKeyCombination = new KeyCodeCombination(KeyCode.ENTER, KeyCombination.ALT_DOWN);
		primaryStage.setFullScreenExitHint("Alt-Enter To Toggle Full-Screened Mode");
		primaryStage.setFullScreenExitKeyCombination(fullScreenedKeyCombination);

		primaryStage.setX(-100);
		primaryStage.setY(100);
		primaryStage.setWidth( 1920 ); //666
		primaryStage.setHeight( 1080 ); //888

		primaryStage.setResizable(false);

		/*primaryStage.setMaximized(true);
		primaryStage.setFullScreen(primaryIsFullScreened);
		primaryStage.show();//*/
		//primaryStage.setMaximized(true);
		/*try { primaryThread.sleep(2400); } catch(InterruptedException e) {
		    System.out.println("got interrupted!");
		}//*/
		/*
		primaryStage.show();
		primaryStage.setFullScreen(primaryIsFullScreened);


		if ( primaryIsFullScreened == false )
		{

		primaryStage.setWidth( 666 ); //666
		primaryStage.setHeight( 888 ); //888

		}
		else
		{
			primaryStage.setWidth( primaryBounds.getWidth() );
			primaryStage.setHeight( primaryBounds.getHeight() );
		}

		primaryStage.setMaximized(true);
		primaryStage.setFullScreen(primaryIsFullScreened);
		primaryStage.show();

		primaryStage.fullScreenProperty().addListener((observable, oldValue, newValue) -> {
			if ( newValue != primaryStage.isFullScreen() )
			{  	primaryStage.setFullScreen(primaryIsFullScreened);
			primaryStage.setWidth( primaryBounds.getWidth() );
			primaryStage.setHeight( primaryBounds.getHeight() );	}
			else
				return;
		}); // */
		//primaryStage.show();

		/*Dimension dimension = new Dimension( (int)bounds.getWidth(), (int)bounds.getHeight() );
		dimension.width = (int)bounds.getWidth();
		dimension.height = (int)bounds.getHeight() + 40;
		Dimension Dim = dimension;//*/

		double fRateDivisor = 192;//24{With 24 Complete PrintScreen .png s //7//468 For Buddhism Testing: 4;//10;//48//192//69;//124;//2;//10;//22<- 444 468 888 HERE HERE HERE DETERMINES FRAME RATE AND RAINBOW MOVEMENT RATE For Rainbow Lights

		//FXMLLoader loader = new FXMLLoader(Sonnet.class.getResource("main.fxml"));

		StackPane stackPane[] = new StackPane[(int)(fRateDivisor + 1)];
		stackPane[0] = new StackPane();
		stackPane[0].setPrefSize( primaryBounds.getWidth(), primaryBounds.getHeight() ); //+ 40 );//stackPane.setPrefSize(1920, 1080);//stackPane.setPrefSize(960, 540);
		//Image image = new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");

		Scene primaryScene[] = new Scene[(int)(fRateDivisor + 1)];
		ProgressBar progressBar = new ProgressBar();
		Button goButton = new Button("Go!");
		Label stateLabel = new Label();
		TextField addressBar = new TextField();
		//addressBar.setText("http://www.google.com");
		//addressBar.setText("http://www.pixies.zone/PixiesTest.html");
		WebView browser = new WebView();
		browser.resize(primaryBounds.getWidth(), primaryBounds.getHeight() );
		//browser.setMinSize(primaryBounds.getWidth(), primaryBounds.getHeight() );
		//browser.setPrefSize( primaryBounds.getWidth(), primaryBounds.getHeight() + 10 ); // Important For Full Screened
		WebEngine webEngine = browser.getEngine();
		//webEngine.load("https://news.google.com/news/?ned=us&hl=en&gl=US");
		webEngine.load( "http://www.pixies.zone/BlankWebPage.html" ); //http://www.pixies.zone/BlankWebPage.html "http://www.pixies.zone/PixiesTest%20-%20Copy%20(4).html" PixiesTest%20-%20Copy%20(2).html");// PixiesTest%20-%20Copy.html"); // ASDF For Rainbow Browser
		/*try { webEngine.wait(1000);
		} catch (InterruptedException e) {
			System.out.println("Interrupted.");
		}*/	

		//while ()
		/*try { primaryThread.sleep(10000);
		} catch (InterruptedException e) {
			System.out.println("Interrupted.");
		}// */
		//webEngine.load("http://www.pixies.zone/PixiesTest.html");
		//primaryStackPane[0].getChildren().add(origionalImageView);
		//stackPane[0].getChildren().add(browser);
		Image origionalBasisImage = new Image("http://www.pixies.zone/Pictures/BuddhismTemplateHD.png");//SciMagOrderMagiEliteFullHDGreenBacking.png//KnightsOfTheSciMagOrderNewPre1.png//BuddhismTemplateHD.png//SciMagOrderMagiEliteFullHD.png
		origionalBasisImage = new Image("http://www.pixies.zone/Pictures/BuddhismTemplateHD.png");
		Image firstBackupWorkAroundImage = new Image("http://www.pixies.zone/Pictures/PixieesText.png");//BuyHempStartImage.png, PixiesWillAlwaysGetReincarnatedText.png
		JFileChooser jFileChooser = new JFileChooser();
		String path = "C:\\TestVideo.mp4", text = "Sky.Netarianism";//"C:\\TestImage.png"//"C:\\TestVideo.mp4"//"C:\\TEMP_Sonnet.mp4";
		File selectedFile = new File (path);
		File javaScriptFile = new File ("C:/Users/AllAV/Desktop/FWA Website/pixies.zone/scrollContinuously444.js");
		File xSliderFile = new File ("C:/Users/AllAV/Desktop/FWA Website/pixies.zone/xSlider.dat");
		jFileChooser.setSelectedFile(selectedFile);
		int returnValue = jFileChooser.showSaveDialog(null);
		if (returnValue == JFileChooser.APPROVE_OPTION)
		{
			selectedFile = jFileChooser.getSelectedFile();
			System.out.println(selectedFile.getName());
			System.out.println(selectedFile.getPath());
		}
		//SequenceEncoder enc = new SequenceEncoder(selectedFile);
		//try { SequenceEncoder enc = new SequenceEncoder(SecondFile); }
		//catch (IOException e) {	throw new RuntimeException(e); }//*/

		//Boolean primaryFullScreened = false; //OLD OLD OLD Important For Full Screened
		Dimension firstDim = new Dimension( (int)primaryBounds.getWidth(), (int)primaryBounds.getHeight() );
		WritableImage origionalTextPicture = new WritableImage( firstDim.width, firstDim.height );//666, 888
		BufferedImage bf = null;
		try {
			bf = ImageIO.read(new File("C:\\Dev\\RainbowSoftware\\Pictures\\SciMagOrderMagiEliteFullHDGreenBacking.png") );///RainbowSoftware/Pictures/SciMagOrderMagiEliteFullHDGreenBacking.png"));
		}
		catch (IOException e) {
		}
		System.out.println( "bf = " + (bf == null) );
		/*try {
			bf = ImageIO.read(new File("C:/Dev/SciMagOrderMagiEliteFullHDGreenBacking.png"));
        } catch (IOException ex) {
            System.out.println("Image failed to load.");
        }
		//ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
		//ImageIO.write( SwingFXUtils.fromFXImage( origionalTextPicture, null ), "png", byteOutput );
		//origionalTextPicture = ImageIO.byteOutput.toByteArray();
		/*BufferedImage bf = null;
        try {
            bf = ImageIO.read(new File("C:/Dev/SciMagOrderMagiEliteFullHDGreenBacking.png"));
        } catch (IOException ex) {
            System.out.println("Image failed to load.");
        }

        //WritableImage wr = null;
        if (bf != null) {
        	origionalTextPicture = new WritableImage(bf.getWidth(), bf.getHeight());
            PixelWriter secondaryPW = origionalTextPicture.getPixelWriter();
            for (int x = 0; x < bf.getWidth(); x++) {
                for (int y = 0; y < bf.getHeight(); y++) {
                    secondaryPW.setArgb(x, y, bf.getRGB(x, y));
                }
            }
        }//*/
		//ImageView imView = new ImageView(origionalBasisImage);
		//origionalTextPicture = SwingFXUtils.toFXImage(bf, origionalTextPicture);
		//System.out.println( "origionalTextPicture = " + (origionalTextPicture == null) );
		//primaryScene[0].snapshot(SwingFXUtils.toFXImage(bf, null));//origionalTextPicture);
		//WritableImage origionalTextPicture = new WritableImage( (int)primaryBounds.getWidth(), (int)primaryBounds.getHeight() );
		/*
		//try { synchronized (webEngine) {
		//	webEngine.wait(2000);
		//} } catch (InterruptedException e) { e.printStackTrace(); }
		if ( primaryStage.isFullScreen() == false )
		{
			if ( primaryIsFullScreened != primaryStage.isFullScreen() )
			{
				primaryStage.setFullScreen(true);
				firstDim.width = 600;
				firstDim.height = 400;
			}
			else 
			{
				firstDim.width = (int)primaryStage.getWidth();
				firstDim.height = (int)primaryStage.getHeight();// + 40;
			}
			//primaryScene[0].snapshot(origionalTextPicture);
			//sP.setViewport( new Rectangle2D( (double)Dim.width, (double)Dim.height, 0, 0 ) );
			primaryStage.setScene(primaryScene[0]);
			primaryStage.setFullScreen(primaryIsFullScreened);
			primaryStage.show();// *_/

		}
		else if ( primaryIsFullScreened != primaryStage.isFullScreen() )
		{
			primaryScene[0].snapshot(origionalTextPicture);
			primaryStage.setFullScreen(primaryIsFullScreened);
			primaryStage.setWidth(primaryScreen.getBounds().getWidth());
			primaryStage.setHeight(primaryScreen.getBounds().getHeight());
			firstDim.width = (int)primaryStage.getWidth();
			firstDim.height = (int)primaryStage.getHeight();// + 40;

			//sP.setViewport( new Rectangle2D( (double)Dim.width, (double)Dim.height, 0, 0 ) );
			primaryStage.setScene(primaryScene[0]);
			primaryStage.setFullScreen(true);
			primaryStage.show();// *_/
		}// Important For Full Screened */
		System.out.println("Got To Worker");
		//Worker<Void> worker = webEngine.getLoadWorker();
		//ASDF PROBLEM PROBLEM PROBLEM BEFORE System.out.println("Not At Problem");
		//worker.stateProperty().addListener(new ChangeListener<State>() {
		//	@Override
		//	public void changed(ObservableValue<? extends State> observable, State oldValue, State newValue) {//System.out.println("Got To Worker Test");
		//		stateLabel.setText("Loading state: " + newValue.toString());
		//		if (newValue == Worker.State.SUCCEEDED) {System.out.println("Not At Problem");
		try { RainbowSystem(primaryStage, origionalBasisImage, /*firstBackupWorkAroundImage,*/ webEngine, browser, stackPane, primaryScene, primaryScreen, fRateDivisor, stateLabel, jFileChooser.getSelectedFile(), javaScriptFile, xSliderFile, primaryThread, primaryIsFullScreened, firstBackupWorkAroundImage ); }//, enc
		catch (IndexOutOfBoundsException e) { System.err.println("IndexOutOfBoundsException: " + e.getMessage()); }
		//}
		//}
		/*scene[(int)fRateDivisor].setOnKeyReleased(new EventHandler<KeyEvent>()
				{
					@Override
					public void handle(KeyEvent event)
					{
						if ( event.isAltDown() == true)
						{
							switch (event.getCode())
							{
							case ENTER: primaryStage.setFullScreen(!primaryStage.isFullScreen()); break;
							}
						}
					}
				});//*/
		/*try { RainbowSystem(primaryStage, browser, stackPane, scene, screen, fRateDivisor, stateLabel, selectedFile); }//enc,
				catch (IOException e) {	throw new RuntimeException(e); }//*/
		//}
		//});



		primaryStage.setScene(primaryScene[0]);// ???
		primaryStage.setFullScreen(primaryIsFullScreened);
		primaryStage.show();

		//progressBar.progressProperty().bind(worker.progressProperty());



		/*goButton.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				String url = addressBar.getText();
				// Load the page.
				webEngine.load(url);
			}
		});//*/
	}





	public static void RainbowSystem (Stage SecondaryStage, Image SecondaryBasisImage, WebEngine SecondBrowserEngine, WebView SecondBrowser, StackPane SecondStackPane[], Scene SecondScene[], Screen SecondScreen,
			double SecondFRateDivisor, Label SecondStateLabel, File SecondFile, File SecondJavaScriptFile, File SecondXSliderFile, Thread SecondaryThread, boolean SecondaryIsFullScreened,
			Image SecondaryBackupWorkAroundImage)//SequenceEncoder SecondEnc, Image SecondBackupWorkAroundImage, 
	{
		System.out.println("Got To The Top Of Worker");
		SecondaryStage.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
		{
			@Override
			public void handle(MouseEvent event) 
			{
				System.exit(0);
			}
		});
		SecondaryStage.setFullScreen(SecondaryIsFullScreened);
		/*try ( PrintWriter out = new PrintWriter(SecondJavaScriptFile.getPath() ) )
		{

			out.println("function scrollContinuously( timeInterval )\r\n" + 
					"{\r\n" + 
					"	timeInterval = 444;\r\n" + 
					"	window.setInterval( scrollWin, timeInterval );\r\n" + 
					"}\r\n" + 
					"function scrollWin()\r\n" + 
					"{\r\n" + 
					"    window.scrollBy( 0, 0 );\r\n" + 
					"}");
			out.close();
		}
		catch(IOException ie) { ie.printStackTrace(); }// Important For Browser AutoScrolling */


		SecondaryStage.fullScreenProperty().addListener((observable, oldValue, newValue) -> {
			if ( newValue != SecondaryStage.isFullScreen() )
			{
				SecondaryStage.setFullScreen(SecondaryIsFullScreened);
				//SecondaryStage.setWidth( primaryBounds.getWidth() );
				// SecondaryStage.setHeight( SecondaryBounds.getHeight() );
				return;
			}
			else
				return;
		});// Important For Full Screened */

		SecondaryStage.fullScreenProperty().addListener((observable, oldValue, newValue) -> {
			if ( newValue == SecondaryStage.isFullScreen() )
			{
				SecondaryStage.setFullScreen(SecondaryIsFullScreened);
				SecondaryStage.setWidth( SecondScreen.getBounds().getWidth() );
				SecondaryStage.setHeight( SecondScreen.getBounds().getHeight() );
				return;
			}
			else
				return;
		});// Important For Not Full Screened */

		System.out.println("Got In Worker Past Full Screening");
		// This is how you know how much screen you can write to.
		Screen screen = Screen.getPrimary();
		Rectangle2D bounds = screen.getVisualBounds();
		System.out.println(bounds);

		//SecondaryStage.setMaximized(true);
		//SecondaryStage.setFullScreen(true); Improtant For Full Screened
		SecondaryStage.setFullScreen(SecondaryIsFullScreened);
		Dimension dimension = new Dimension( (int)bounds.getWidth(), (int)bounds.getHeight() );
		//Dimension dimension = new Dimension( 666, 888 );// 666, 888
		//dimension.width = (int)bounds.getWidth();// All Around Here Important For Full Screened
		//dimension.height = (int)bounds.getHeight();// + 40;
		Dimension Dim = dimension;// */

		//Dimension Dim = new Dimension();
		//Dim.width = (int)SecondaryStage.getWidth(); // Important For Full Screened
		//Dim.height = (int)SecondaryStage.getHeight();// + 40; // Important For Full Screened Without + 40
		SecondaryStage.setFullScreen(SecondaryIsFullScreened);
		SecondaryStage.setTitle(SecondBrowser.getEngine().getLocation());
		SecondStateLabel.setText("Finish!");
		SecondaryStage.setFullScreen(SecondaryIsFullScreened);
		//SequenceEncoder enc = new SequenceEncoder(SecondFile);
		//try { SequenceEncoder enc = new SequenceEncoder(SecondFile); }
		//catch (IOException e) {	throw new RuntimeException(e); }//*/


		if ( SecondaryIsFullScreened == false )
		{
			SecondBrowser.autosize();
			SecondBrowser.resize( 666, 888 );
		}
		SnapshotParameters sP = new SnapshotParameters();
		//sP.setViewport( new Rectangle2D(-8, -19, 666, 888 ) );
		//SecondBrowser.resizeRelocate( -8, -19, 666, 888 );

		//WritableImage origionalTextPicture = new WritableImage( Dim.width, Dim.height );
		WritableImage secondaryBufferPicture = new WritableImage( Dim.width, Dim.height );
		//origionalTextPicture = SecondBrowser.snapshot(null, secondaryBufferPicture);
		//SecondBrowser.snapshot(sP, secondaryBufferPicture);
		SecondaryStage.show();
		WritableImage nextTextPicture = new WritableImage( Dim.width, Dim.height ), bufferPicure = new WritableImage( Dim.width, Dim.height );
		//SecondBrowser.snapshot(sP, nextTextPicture);
		/*//Image origionalBrowserImage = new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");//browser.snapshot(sP, nextTextPicture);//new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");//
			//Image origionalBrowserImage = new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Test.png");//browser.snapshot(sP, nextTextPicture);//new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");//
			stackPane[0].getChildren().add(browser);

			scene[0] = new Scene(stackPane[0]);
			SecondaryStage.setScene(scene[0]);

			SecondaryStage.setFullScreen(true);
			SecondaryStage.show();

			//boolean encFinished = false;
			//while (encFinished =  false)
				//if ( stateLabel.getText() == "Finish!")//SecondaryStage.isShowing() && SecondaryStage.isFullScreen() )
				//{*/
		//SecondStackPane[0].getChildren().add(SecondBrowser);
		Image origionalBrowserImage = SecondaryBackupWorkAroundImage;
		//Image origionalBrowserImage = SecondBrowser.snapshot(sP, nextTextPicture);		/*sP.setViewport(SecondScreen.getBounds());
		SecondStackPane[0] = new StackPane();
		//while ( SecondBrowser.isVisible() == false )//fdsa
		//try { SecondaryThread.wait();
		//} catch (InterruptedException e) {
		//	System.out.println("Interrupted.");
		//}
		SecondStackPane[0].getChildren().add(SecondBrowser);
		SecondScene[0] = SecondStackPane[0].getScene();
		SecondScene[0] = new Scene(SecondStackPane[0]);
		SecondaryStage.setFullScreen(SecondaryIsFullScreened);
		//while ( SecondBrowser.isVisible() && SecondaryStage.isShowing() )//fdsa
		//	try {

		//double xSlider = 0; //MUST START OUT AS 0 Or Else Video Won't Produce Or Potentially Scroll At All!
		SecondBrowser.autosize();

		//SecondBrowser.resize(1080, 1930 );
		System.out.println("Got To Main Listener");
		SecondBrowserEngine.getLoadWorker().stateProperty().addListener(
				new ChangeListener() {
					public void changed(ObservableValue observable, Object oldValue, Object newValue) {
						SecondaryStage.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
						{
							@Override
							public void handle(MouseEvent event) 
							{
								System.exit(0);
							}
						});
						System.out.println("oldValue: " + oldValue);
						System.out.println("newValue: " + newValue);
						SecondaryStage.setFullScreen(SecondaryIsFullScreened);
						if (newValue == Worker.State.SUCCEEDED) {
							//document finished loading
							System.out.println("Worker State:" + Worker.State.values());
							SecondaryStage.setFullScreen(SecondaryIsFullScreened);
							System.out.println("Worked Till After Here");
							//sP.setViewport(SecondScreen.getBounds());
							//sP.setViewport( new Rectangle2D(-8, -19, 666, 888 ) );
							SecondStackPane[0] = new StackPane();
							//while ( SecondBrowser.isVisible() == false )//fdsa
							//try { SecondaryThread.wait();
							//} catch (InterruptedException e) {
							//	System.out.println("Interrupted.");
							//}
							SecondStackPane[0].getChildren().add(SecondBrowser);
							SecondScene[0] = SecondStackPane[0].getScene();
							SecondScene[0] = new Scene(SecondStackPane[0]);
							SecondaryStage.setFullScreen(SecondaryIsFullScreened);
							SecondaryStage.show();
							System.out.println("Worked Till After 1.5");
							//origionalBrowserImage = SecondBrowser.snapshot(sP, nextTextPicture);
							Image secondaryCurrentBrowserImage = origionalBrowserImage;// !!!!! Uncomment To Show Video !!!!!
							System.out.println("Worked Till After 1.6");
							//origionalBrowserImage = SecondScene[0].snapshot(nextTextPicture);
							//origionalBrowserImage = SecondStackPane[0].getScene().snapshot(bufferPicure);
							SecondaryStage.setScene(SecondScene[0]);
							System.out.println("Worked Till After 1.7");
							//SecondaryStage.setFullScreen(SecondaryIsFullScreened);
							System.out.println("Worked Till After 1.8");
							/*try { SecondaryThread.sleep(4000);
							} catch (InterruptedException e) {
								System.out.println("Interrupted.");
							}// */
							SecondaryStage.show();// !!!!! Uncomment To Show Video !!!!!
							//origionalBrowserImage = SecondBrowser.snapshot(sP, bufferPicure);
							System.out.println("Got Stopped Up Show Command In");
							//origionalBrowserImage = SecondBrowser.snapshot(sP, secondaryBufferPicture);//new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");
							secondaryCurrentBrowserImage = origionalBrowserImage;// !!!!! Uncomment To Show Video !!!!!
							///TEST
							//SecondStackPane[0].getChildren().add(SecondBrowser);

							PixelReader origionalpr = origionalBrowserImage.getPixelReader();
							origionalpr = origionalBrowserImage.getPixelReader();//ASDF HERE HERE For Rainbow Browser
							//PixelReader origionalpr = SecondBackupWorkAroundImage.getPixelReader();
							//origionalpr = SecondScene[0].snapshot(bufferPicure).getPixelReader();//ASDF HERE HERE For Rainbow Browser
							//bufferPicure = new WritableImage( Dim.width, Dim.height );
							//origionalpr = SecondStackPane[0].getScene().snapshot(bufferPicure).getPixelReader();
							PixelWriter origionalpw = secondaryBufferPicture.getPixelWriter();
							ImageView origionalImageView = new ImageView();
							origionalImageView.setImage(SecondaryBasisImage);//origionalBrowserImage
							//origionalImageView.setImage(origionalBrowserImage); //ASDF FOR RAINBOW BROWSER
							//origionalImageView.setImage(SecondBackupWorkAroundImage);



							//SecondScene[0].setRoot(SecondBrowser);

							//SecondStackPane[0].getChildren().add(origionalImageView);
							//SecondStackPane[0].getChildren().add(SecondBrowser);


							/*File tempFile;
					//WebDriver driver=new FirefoxDriver();

					// Maximize the window
					driver.manage().window().maximize();

					// Pass the url
					driver.get("http://www.pixies.zone/PixiesTest.html");

					// Take screenshot and store as a file format
					File src= ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
					try {// now copy the  screenshot to desired location using copyFile //method
						FileUtils.copyFile(src, new File("C:/TempImage.png"));
					}

					catch (IOException e)
					{
						System.out.println(e.getMessage());

					}// */
							System.out.println("Worked Till After Here 2");
							PixelReader basispr = SecondaryBasisImage.getPixelReader();
							basispr = SecondaryBasisImage.getPixelReader();
							WritableImage secondaryWritableImage = nextTextPicture; //USE FOR ???
							PixelReader pr = secondaryWritableImage.getPixelReader();
							PixelWriter secondaryPW = secondaryWritableImage.getPixelWriter();
							ImageView secondaryImageView = new ImageView();
							secondaryImageView.setImage(secondaryWritableImage);
							
							double secondaryNumberOfScrollFrames = 9999;//Testing 2; Normally 11;

							ColorSlider black = new ColorSlider( new double[]{0,0,0} );

							//ColorSlider color = black;
							Diagnostics diagnostics = new Diagnostics( SecondScreen.getBounds() );
							RainbowSoftColor color = new RainbowSoftColor( new double[]{0,0,0,1} );//????????????????????????????
							RainbowPattern2D pattern2D = new RainbowPattern2D( new double[]{0,0,0,1} );
							RainbowSoft2D rainbowSoft2D = new RainbowSoft2D( new double[]{0,0,0,1} );
							TransparencySlider transparencySlider = new TransparencySlider( new double[]{0,0,0,1} );
							RainbowSoftColor rainbowSoftColor = new RainbowSoftColor( new double[]{0,0,0,1} );
							Color tempFXColor = Color.BLACK;

							TransparencySlider redTransparencySlider = new TransparencySlider( new double[]{193,0,0,1} );
							TransparencySlider blueTransparencySlider = new TransparencySlider( new double[]{0,0,192,1} );

							String typeOfDisplay = "FullDisplay";
							Color colorTooSimilarReplacementColor = Color.color( 0., 1., 0., 1. );
							double colorDifference = 164.;

							ColorTooSimilar neonGreenCheck = new ColorTooSimilar();

							int numberOfColorsInTheRainbow = 7;//asdf Always Worry About This!

							int x = 0, y = 0;
							
							double xSlider = 0; //MUST START OUT AS 0 Or Else Video Won't Produce Or Potentially Scroll At All!
							Dimension HalfedDim = new Dimension();
							//HalfedDim.width = Math.round( ( Dim.width + 1 ) / 2 - 1 );
							//HalfedDim.height = Math.round( ( Dim.height + 1 ) / 2 - 1 );
							HalfedDim.width = Math.round( Dim.width / 2 );
							HalfedDim.height = Math.round( Dim.height / 2 );
							//double radialDistance = Math.pow(Math.pow(HalfedDim.width + 1, 2) + Math.pow(HalfedDim.height + 1, 2), 0.5);
							double halfSreenDiagionalLength = Math.pow(Math.pow( HalfedDim.getWidth(), 2) + Math.pow( HalfedDim.getHeight(), 2), 0.5);
							//double radialDistance = Math.pow(Math.pow(HalfedDim.width, 2) + Math.pow(HalfedDim.height, 2), 0.5);//HalfedDim.width + 1 HalfedDim.height + 1
							double fullAngle = Math.PI * halfSreenDiagionalLength;
							//double archimedesZoomFactor = 1;
							//int varGradAdjGradChoiceNum = 0;//Variated = 0, Graduated = 1, Adjusted-Graduated = 2
							
							//double fullAngle = Math.PI * radialDistance;
							//double sliderInterval = fullAngle / SecondFRateDivisor;// / 10 For Rainbow Spotlight Last Division Determines The Frame Rate
							

							SeekableByteChannel SecondaryVideoOut = null;
							
							RainbowVideo rainbowVideo = new RainbowVideo ( SecondaryStage, SecondaryBasisImage, SecondBrowserEngine, SecondBrowser, SecondStackPane, SecondScene, SecondScreen,
									SecondStateLabel, SecondFile, SecondJavaScriptFile, SecondXSliderFile, SecondaryThread, SecondaryIsFullScreened,
									SecondaryBackupWorkAroundImage, SecondFRateDivisor, 0, fullAngle, SecondaryVideoOut, secondaryWritableImage, secondaryPW, secondaryImageView, secondaryCurrentBrowserImage, secondaryBufferPicture, secondaryNumberOfScrollFrames );
							
							try
							{
								rainbowVideo.Runner();
							}
							catch (IndexOutOfBoundsException e) { System.err.println("IndexOutOfBoundsException: " + e.getMessage()); }
							//catch(IOException ie) { ie.printStackTrace(); }
							//finally {
							//	NIOUtils.closeQuietly(SecondaryVideoOut);
							//}
							System.exit(0);
							//return;
						}
						//return;
					}
				}
				);

		/*synchronized ( SecondaryThread )
						{

							System.out.println("Before Wait");
							SecondaryThread.wait(10000);
							System.out.println("Past Wait");
						}//SecondaryThread.wait(1000);
			} catch (InterruptedException ex) {
				System.err.println("An InterruptedException was caught: " + ex.getMessage());
				ex.printStackTrace();
			}*/
		//SecondaryStage.show();
		//origionalBrowserImage = SecondBrowser.snapshot(sP, nextTextPicture);
		//Image origionalBrowserImage = SecondBrowser.snapshot(sP, nextTextPicture);
		//nextTextPicture = SecondBrowser.snapshot(sP, nextTextPicture);
		//Image origionalBrowserImage = SecondScene[0].snapshot(nextTextPicture);
		/*origionalBrowserImage = SecondScene[0].snapshot(nextTextPicture);
		origionalBrowserImage = SecondStackPane[0].getScene().snapshot(bufferPicure);
		SecondaryStage.setScene(SecondScene[0]);
		SecondaryStage.setFullScreen(true);
		try { SecondaryThread.sleep(4000);
		} catch (InterruptedException e) {
			System.out.println("Interrupted.");
		}
		SecondaryStage.show();// */
		/*SecondScene[(int)(SecondFRateDivisor * xSlider/fullAngle)].setOnKeyReleased(new EventHandler<KeyEvent>()
		{
			@Override
			public void handle(KeyEvent event)
			{
				if ( event.isAltDown() == true)
				{
					switch (event.getCode())
					{
					case ENTER: SecondaryStage.setFullScreen(!SecondaryStage.isFullScreen()); break;
					}
				}
			}
		});//*/

		//VBox root = new VBox();
		//root.getChildren().addAll(addressBar, goButton, stateLabel, progressBar, browser);
		//SecondScene[0] = new Scene(SecondStackPane[0]);
		//SecondaryStage.setScene(SecondScene[0]);



		//SecondaryStage.setFullScreen(true);
		//SecondaryStage.show();

		//WritableImage nextTextPicture = new WritableImage( Dim.width, Dim.height );
		//Image origionalBrowserImage = new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");//browser.snapshot(sP, nextTextPicture);//new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");//
		//Image origionalBrowserImage = new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Test.png");//browser.snapshot(sP, nextTextPicture);//new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");//
		//SecondStackPane[0].getChildren().add(browser);

		//SecondScene[0] = new Scene(SecondStackPane[0]);
		//SecondaryStage.setScene(SecondScene[0]);

		//SecondaryStage.setFullScreen(true);
		//SecondaryStage.show();
		//JUST THIS DISPLAYS BROWSER!!!!!






		//nextTextPicture = SecondScene[0].snapshot(null);

		//Image origionalBrowserImage = SecondScene[0].snapshot(null);//browser.snapshot(sP, nextTextPicture);
		//Image origionalBrowserImage = new Image("http://www.nanofirm.org/scimagorder.com/Pictures/FatLevels.png");

		///TEST


		/*try { SecondEnc.finish(); }
		catch(IOException ie) { ie.printStackTrace(); }//*/

		//encFinished = true;
		//}
		/*webEngine.getLoadWorker().stateProperty().addListener(
	        new ChangeListener<State>() {
	            public void changed(ObservableValue ov, State oldState, State newState) {
	                if (newState == State.SUCCEEDED) {
	                    SecondaryStage.setTitle(webEngine.getLocation());
	                }
	            }
	        });*/
		/*browser.getEngine().getLoadWorker().stateProperty().addListener(
			  (ObservableValue<? extends worker.State> observable,
			    worker.State oldValue,
			    worker.State newValue) -> {
			    if( newValue != worker.State.SUCCEEDED ) {
			      return;
			    }

			    // Your logic here
			  } );*/

		//if (worker.State.SUCCEEDED == true)
		//{


		//}
		/*SecondScene.setOnKeyReleased(new EventHandler<KeyEvent>()
	{
		@Override
		public void handle(KeyEvent event)
		{
			if ( event.isAltDown() == true)
			{
				switch (event.getCode())
				{
					case ENTER: SecondaryStage.setFullScreen(!SecondaryStage.isFullScreen()); break;
				}
			}
		}
	});//*
		SecondScene[(int)SecondFRateDivisor].setOnKeyReleased(new EventHandler<KeyEvent>()
		{
			@Override
			public void handle(KeyEvent event)
			{
				if ( event.isAltDown() == true)
				{
					switch (event.getCode())
					{
					case ENTER: SecondaryStage.setFullScreen(!SecondaryStage.isFullScreen()); break;
					}
				}
			}
		});
	//*/
		//browser.snapshot(sP, nextTextPicture);
	}
	//@Override
	public void onKeyPressed(KeyEvent SecondEvent) {
		if (SecondEvent.getKeyCode() == KeyCode.ESCAPE.hashCode()) {
			System.exit(0);
		}
	}// */
	
	public static void main(String[] args) throws IOException
	{
		/*args.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
        {
            public void handle(MouseEvent event) 
            {
                System.exit(0);
            }
        });// */
		launch(args);

	}

}